/*
 * Copyright 2013 Red Hat, Inc. and/or its affiliates.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *       http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.guvnor.common.services.project.model;

import org.jboss.errai.common.client.api.annotations.Portable;
import org.uberfire.backend.vfs.Path;

import static org.uberfire.commons.validation.PortablePreconditions.*;

/**
 * An item representing a Package within a Project
 */
@Portable
public class Package {

    private Path projectRootPath;
    private Path packageMainSrcPath;
    private Path packageTestSrcPath;
    private Path packageMainResourcesPath;
    private Path packageTestResourcesPath;
    private String packageName;
    private String caption;
    private String relativeCaption;

    public Package() {
        //For Errai-marshalling
    }

    public Package( final Path projectRootPath,
                    final Path packageMainSrcPath,
                    final Path packageTestSrcPath,
                    final Path packageMainResourcesPath,
                    final Path packageTestResourcesPath,
                    final String packageName,
                    final String caption,
                    final String relativeCaption ) {
        this.projectRootPath = checkNotNull( "projectRootPath",
                                             projectRootPath );
        this.packageMainSrcPath = packageMainSrcPath;
        this.packageTestSrcPath = packageTestSrcPath;
        this.packageMainResourcesPath = packageMainResourcesPath;
        this.packageTestResourcesPath = packageTestResourcesPath;
        this.packageName = checkNotNull( "packageName", packageName );
        this.caption = checkNotNull( "caption", caption );
        this.relativeCaption = checkNotNull( "relativeCaption", relativeCaption );
    }

    public Path getProjectRootPath() {
        return this.projectRootPath;
    }

    public Path getPackageMainSrcPath() {
        return packageMainSrcPath;
    }

    public Path getPackageTestSrcPath() {
        return packageTestSrcPath;
    }

    public Path getPackageMainResourcesPath() {
        return packageMainResourcesPath;
    }

    public Path getPackageTestResourcesPath() {
        return packageTestResourcesPath;
    }

    public String getPackageName() {
        return this.packageName;
    }

    public String getCaption() {
        return this.caption;
    }

    public String getRelativeCaption() {
        return relativeCaption;
    }

    @Override
    public boolean equals( Object o ) {
        if ( this == o ) {
            return true;
        }
        if ( !( o instanceof Package ) ) {
            return false;
        }

        Package aPackage = (Package) o;

        if ( !caption.equals( aPackage.caption ) ) {
            return false;
        }
        if ( !packageName.equals( aPackage.packageName ) ) {
            return false;
        }
        if ( !projectRootPath.equals( aPackage.projectRootPath ) ) {
            return false;
        }
        if ( packageMainSrcPath != null ? !packageMainSrcPath.equals( aPackage.packageMainSrcPath ) : aPackage.packageMainSrcPath != null ) {
            return false;
        }
        if ( packageTestSrcPath != null ? !packageTestSrcPath.equals( aPackage.packageTestSrcPath ) : aPackage.packageTestSrcPath != null ) {
            return false;
        }
        if ( packageMainResourcesPath != null ? !packageMainResourcesPath.equals( aPackage.packageMainResourcesPath ) : aPackage.packageMainResourcesPath != null ) {
            return false;
        }
        if ( packageTestResourcesPath != null ? !packageTestResourcesPath.equals( aPackage.packageTestResourcesPath ) : aPackage.packageTestResourcesPath != null ) {
            return false;
        }

        return true;
    }

    @Override
    public int hashCode() {
        int result = projectRootPath.hashCode();
        result = ~~result;
        result = 31 * result + ( packageMainSrcPath != null ? packageMainSrcPath.hashCode() : 0 );
        result = ~~result;
        result = 31 * result + ( packageTestSrcPath != null ? packageTestSrcPath.hashCode() : 0 );
        result = ~~result;
        result = 31 * result + ( packageMainResourcesPath != null ? packageMainResourcesPath.hashCode() : 0 );
        result = ~~result;
        result = 31 * result + ( packageTestResourcesPath != null ? packageTestResourcesPath.hashCode() : 0 );
        result = ~~result;
        result = 31 * result + packageName.hashCode();
        result = ~~result;
        result = 31 * result + caption.hashCode();
        result = ~~result;
        return result;
    }
}
